package com.dingwen.treasure.business.controller;

import com.dingwen.treasure.base.controller.BaseViewController;
import com.dingwen.treasure.base.pojo.vo.Result;
import com.dingwen.treasure.business.factory.PayFactory;
import com.dingwen.treasure.business.service.PayService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/**
 * 支付控制器：简单工厂 + 模版方法 + 策略模式 + 函数式接口
 *
 * @author dingwen
 * @date 2022/05/03
 */
@Api(tags = "支付案例，简单工厂 + 模版方法 + 策略模式 + 函数式接口")
@RestController
@RequestMapping("pay")
@Slf4j
public class PayController implements BaseViewController {

    /**
     * pay 工厂
     */
    @Autowired
    private  Map<String, PayService> payFactory;

    /**
     *
     *
     * @param payType 支付类型
     * @return {@link Result}
     */
    @ApiOperation(value = "支付测试")
    @ApiImplicitParam(name = "payType", value = "支付类型", type = "String", required = true)
    @GetMapping()
    public void pay(@RequestParam("payType") String payType) {

        Assert.hasText(payType, "支付类型不能为空");


        // 按支付服务名称实现
        PayService payService = implementsByPayServiceName(payType);

        // 按支付服务获取支付类型实现
        //PayService payService = implementsByPayServiceGetPayType(payType);

        Assert.notNull(payService, "此支付通道未开启");

        payService.pay();

    }

    /**
     * 按支付服务名称实现
     *
     * @param payType 薪酬类型
     * @return {@link PayService}
     */
    private PayService implementsByPayServiceName(String payType){
       return payFactory.get(payType);
    }

    /**
     * 按支付服务获取支付类型实现
     *
     * @param payType 薪酬类型
     * @return {@link PayService}
     */
    private PayService implementsByPayServiceGetPayType(String payType){
        return PayFactory.PAY_SERVICE_MAP.get(payType);
    }
}
